#include "head.h"
#include <complex.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

void command_puts(command_t* command,int net_fd){
    int name_len;
    recv(net_fd,&name_len,sizeof(int),MSG_WAITALL);
    printf("接收的文件名字长度是 %d\n",name_len);

    char file_name[60] = {0};
    recv(net_fd,file_name,name_len,MSG_WAITALL);
    printf("接收的文件名字是 %s\n",file_name);
    int file_fd = open(file_name,O_RDWR | O_CREAT,0600);
    ERROR_CHECK(file_fd,0,"open");


    int clientfile_len;
    recv(net_fd,&clientfile_len,sizeof(int),MSG_WAITALL);
    printf("接收的文件长度是%d\n",clientfile_len);
    struct stat stat_file;
    fstat(file_fd,&stat_file);

    send(net_fd,&stat_file.st_size,sizeof(int),MSG_NOSIGNAL);//发送客户端自己的文件长度

    if(stat_file.st_size == 0){//如果从来没有接收过文件
        ftruncate(file_fd,clientfile_len);
        printf("创建的文件长度是 %d\n",clientfile_len);
        char* p = (char*)mmap(NULL,
                              clientfile_len,
                              PROT_READ|PROT_WRITE,
                              MAP_SHARED,
                              file_fd,
                              0);//注意这里是文件的起始位置同时偏移量必须是4096倍数
        int offset = 0;
        while(offset < clientfile_len){
            int recv_ret = recv(net_fd,
                                p + offset,
                                clientfile_len-offset,
                                0);
            offset += recv_ret;
        }
        munmap(p,clientfile_len);

        if(offset != clientfile_len){
            ftruncate(net_fd,clientfile_len - offset);
        }
    }else if(stat_file.st_size != clientfile_len){//实现断点续传
        ftruncate(file_fd,clientfile_len);//截断为之前的大小
        int recv_len = clientfile_len - stat_file.st_size;//需要接收的文件长度大小
                                                          
        printf("需要接收的文件长度是%d\n",recv_len);
        printf("创建的文件长度是 %d\n",clientfile_len);                

        char* p = (char*)mmap(NULL,
                              clientfile_len,
                              PROT_READ | PROT_WRITE,
                              MAP_SHARED,
                              file_fd,
                              0);

        int recv_ret = recv(net_fd,
                            p + stat_file.st_size,
                            recv_len ,
                            MSG_WAITALL); 
        ERROR_CHECK(recv_ret,0,"recv");

        munmap(p,recv_len);
        if(recv_ret != recv_len){
            ftruncate(file_fd,recv_ret + stat_file.st_size);
        }
    }
    return;

}
